package com.ah.ajax_json;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import com.google.gson.reflect.TypeToken;
public class JsonByGsonConsole {
	@Test
	public void t1_Java对象转Json() {
		People p = new People();
		p.setName("甘宁");
		p.setPower(87);
		Gson gson = new Gson();
		// Object → json字符串
		String json = gson.toJson(p);
		// 测试
		System.out.println("java2Json:" + json);
	}
	@Test
	public void t2_json转Java对象() {
		String json = "{'name':'吕奉先','power':100}";
		Gson gson = new Gson();
		// json字符串 → Object
		People p = gson.fromJson(json, People.class);
		// 测试获取到的内容
		System.out.println("json2Object:" + p.getName() + ":" + p.getPower());
	}
	@Test
	public void t3_Json转List() {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		sb.append("{'name':'张辽','power':93},");
		sb.append("{'name':'徐晃','power':94},");
		sb.append("{'name':'张郃','power':91},");
		sb.append("{'name':'于禁','power':90},");
		sb.append("{'name':'乐进','power':87}");
		sb.append("]");
		String json = sb.toString();
		Gson gson = new Gson();
		// json→List
		java.lang.reflect.Type tp = new TypeToken<List<People>>() {}.getType();
		List<People> ps = gson.fromJson(json, tp);
		// 测试获取到的内容
		System.out.println("json2List：" + ps.size());
	}
	@Test
	public void t4_json转Map() {
		StringBuilder sb = new StringBuilder();
		sb.append("{");
		sb.append("'锦马超':{'name':'马超','Power':96},");
		sb.append("'猛张飞':{'name':'张飞','Power':96}");
		sb.append("}");
		String json = sb.toString();
		Gson gson = new Gson();
		// json→List
		java.lang.reflect.Type tp = new TypeToken<Map<String, People>>() {}
				.getType();
		Map<String, People> mp = gson.fromJson(json, tp);
		// 测试获取到的内容
		People test = (People) mp.get("猛张飞");
		System.out.println("json2Map:" + test.getName());
	}
	@Test
	public void t5_Json节点解析() {
		// Gson的节点对象：JsonElement,有如下子类：
		// JsonPrimitive：
		// |--short、int、long、double、float、
		// |--byte、boolean、char、
		// |--String、BigDecimal、BigInteger、Number
		// JsonNull：空节点。即key,value为空
		// JsonObject：对象类型节点
		// JsonArray：数组类型、集合类型
		StringBuilder sb = new StringBuilder();
		sb.append("{");
		sb.append("'flag':true,");
		sb.append("'data':{'name':'典韦','power':98}");
		sb.append("}");
		String json = sb.toString();
		// 1.创建解析者(JsonParser)
		JsonParser parser = new JsonParser();
		// 2.获得“根节点”
		JsonElement jsonElement = parser.parse(json);
		JsonObject root = jsonElement.getAsJsonObject();
		// 3.取得“根节点”下的的节点
		// 3.1.获得flag节点（基本数据节点）
		JsonPrimitive jsonFlag = root.getAsJsonPrimitive("flag");
		boolean flag = jsonFlag.getAsBoolean();
		// 3.2.获得 data节点（Object节点）
		JsonObject jsonObj = root.getAsJsonObject("data");
		// 3.2.1.JsonObject→对象
		People p = new Gson().fromJson(jsonObj, People.class);
		// 测试获取到的内容
		System.out.println("json节点解析：" + flag + p.getName() + p.getPower());
	}
}
